[Sê-ri nhai và nuốt] Cuốn JS: The Good Parts

Nhai và nuốt là một sê-ri ghi chú lại kiến thức học được từ sách.

Đáng lẽ 1 cuốn sách phải chia ra nhiều bài vì quá dài, nhưng vì mình lười. Anh nào, em nào, bố trẻ nào, cô cậu chú bác nào có vấn đề với bài viết dài thì cứ chửi.

Lên dĩa đầu tiên trong sê-ri này là:

JavaScript: The Good Parts

Đọc xong: 10/6/17. Mình sẽ cập nhật những gì mình cho là cần nhớ trong sách ở đây.

Table of Content:

  1. Good Parts - chả có gì để ghi chú :lol:
  2. Grammar
  3. Objects
    • Object Literals
    • Retrieval
    • Update
    • Reference
    • Prototype
    • Reflection
    • Enumeration
    • Delete
    • Global Abatement
  4. Functions
    • Function Objects
    • Function Literal
    • Invocation
    • Arguments
    • Return
    • Exceptions
    • Augmenting Types
    • Recursion
    • Scope
    • Closure
    • Callbacks
    • Module
    • Cascade
    • Curry
    • Memoization
  5. Inheritance
    • Pseudoclassical
    • Object Specifiers
    • Prototypal
    • Functional
    • Parts
  6. Arrays
    • Array Literals
    • Length
    • Delete
    • Enumeration
    • Confusion
    • Methods
    • Dimensions
  7. Regular Expressions
    • An Example
    • Construction
    • Elements
  8. Methods
  9. Style
  10. Beautiful Features
  11. Appendix A, B, C, D

Okay, vào phần chính.

Chapter 2: Grammar

Whitespace

block comment:

/*cái quần què gì
ở trong này
cũng được
trừ RegExp*/

line comment:

// đằng sau dấu này thì ghi cái quần què gì cũng được miễn là còn cùng trong 1 hàng
// đây là 1 line cmt khác
  1. Dùng block cmt không an toàn để ẩn 1 đoạn code, nên dùng line cmt (trong Sublime Text 3 chỉ cần chọn đoạn code cần ẩn đi & nhấn Ctrl + /).
  2. Chỉ nên dùng block cmt ở đầu file, ví dụ như để đặt đoạn description của file đó.

Names

  1. Phải bắt đầu bằng 1 chữ cái, sau đó thì có thể là A-Z a-z 0-9 _ tuỳ ý.
  2. Các reserved words: (các keyword không được phép sử dụng làm Name trong JS)

Numbers

  1. 64-bit floating point: Có cần quan tâm không? Không? Tốt.
  2. JS chỉ có 1 kiểu dữ liệu số (không có kiểu số nguyên (integer) riêng biệt như các ngôn ngữ lập trình khác nên không cần khai báo kiểu dữ liệu đối với số), do đó:
1 === 1.0 //true
3e-2 === 0.03 //true, 3 nhân 10 mũ -2
3e2 === 300 //true, 3 nhân 10 mũ 2
  1. NaN khác mọi giá trị kể cả chính nó. NaN và Infinity là kiểu dữ liệu number.
typeof NaN; // number
typeof Infinity; // number

Strings

  1. 16-bit character set of Unicode: bạn sẽ lại quan tâm chứ? Okay, tốt.
  2. Escape characters: dành cho các ký tự đặc biệt
ý nghĩa
\b backspace
\f formfeed
\t tab
\n new line ký tự xuống dòng
\r carriage return cái gì đây???
\u + <4 hex digits> ký tự chuyển về từ bảng mã hex
  1. Str có prop length (chỉ str và arr có prop này).
'bảykýtự'.length === 7 // true
  1. Không thể thay đổi 1 str, nhưng str có các method để giúp bạn tạo ra 1 str mới từ str ban đầu.

Statements

var, let, const statement
  1. Biến được định nghĩa bởi var chỉ có func scope, không có block scope, let & const trong ES2015 thì có block scope.
  2. 1 block gồm nhiều statement bao bởi 2 ngoặc nhọn { }.
  3. Nên định nghĩa các biến ở đầu 1 func.
  4. Các giá trị Falsy & Truthy

Những giá trị nào không nằm trong cột falsy thì đều là truthy.

Falsy Truthy
false true
null
undefined
0, -0
'' (str rỗng) 'false'
NaN
switch statement
  1. Chỉ kiểm tra được các case cụ thể (sẽ test bằng === operator), và chỉ đối với str và num.
  2. Có thể liệt kê nhiều case liên tục.
  3. Phải có break hoặc return statement để tránh không cho thực thi xong case này lại test tiếp case khác.
while statement
  • Test trước thực thi sau.
for statement
  1. Có 3 phần: initialization, condition, increment.
  2. Nếu condition bị bỏ qua, giá trị true sẽ được gán vào (nghĩa là vòng lặp sẽ chạy mãi nếu không có break hoặc return statement trong block code được thực thi).
for...in... statement
  1. Chỉ dùng riêng cho obj (giống như forEach() chỉ có riêng cho arr).
for (let keyName in objName) {
// viết cái gì vào đây cũng được
}
  1. Theo cấu trúc ở trên thì khi muốn lấy value từ tên key (keyName - theo demo ở trên) thì phải dùng objName[keyName] chứ không được dùng objName.keyName. Vì keyName là 1 biến sẽ chứa 1 str (key trong cặp key-value của prop trong obj luôn là str).
var objName = {
ahihi: 'tao là ahihi',
ahoho: 'tao là ahoho, bố của ahihi'
};
for (let keyName in objName) {
console.log(objName.keyName);// undefined
console.log(objName[keyName]);// cái này thì chuẩn
}
  1. Luôn dùng method objName.hasOwnProperty(keyName) để check xem prop mà vòng lặp này đang quét có thực sự là của obj đó hay không, hay là 1 prop được inherit từ prototype chain của obj đó.
do statement

Ngược lại với while statement.

try statement
  1. Thực thi 1 block và bắt tất cả exeption được throw trong block đó.
  2. Cách sử dụng???
throw statement
  1. Tạo ra 1 exception obj. Nếu JS control gặp throw statement ở trong 1 try block thì nó sẽ đi thẳng đến catch clause của try block và thực thi lệnh bên trong catch block.
  2. Expression của throw statement thường là 1 exception (error) obj. Cần đặt value cho 2 prop quan trọng nhất của 1 error obj là: name & message.
return statement
  1. Nếu expression của return statement không được xác định thì mặc định giá trị được trả về sẽ là undefined.
  2. JS không cho phép viết return trên 1 dòng rồi xuống dòng mới viết expression cho nó.
break statement
  1. Dùng để thoát khỏi loop (for, while, do) hoặc if/switch statement.
  2. Expression của break statement là 1 label, là label của loop/if/switch statement nào đó mà label của nó đã được đặt tên.
  3. Tương tự return statement: không cho phép viết breaklabel của nó trên 2 dòng khác nhau.
expresstion statement

Thường dùng để gán giá trị cho biến (variable assignment) hoặc thực thi cái gì đó (VD: thực thi (invoke) một func).

Expressions

Expression là 1 khái niệm. Nếu xem statement là 1 bức tường thì expression là các viên gạch được dùng trong “bức tường” đó. Trong 1 statement có nhiều vị trí cho các expression.

  1. Tenary operator ?: tác dụng tương tự 1 if...else statement, nhưng tổng thể thì vẫn là 1 expression chứ không phải 1 statement.

  2. Thứ tự ưu tiên của các operator trong JS (giảm dần):

    • . [] ()
    • delete new typeof + - !
    • * / %
    • + -
    • >= <= > <
    • === ==
    • &&
    • ||
    • ?:
    • = (???)

    Đối với những operator trong cùng 1 hàng: thực hiện từ trái sang phải.

  3. prefix operators:

typeof []; // obj
typeof null; // obj
  1. infix operators:
    • && trả về giá trị của operand đầu tiên (bên trái) nếu operand đó là falsy value (không quan tâm operand thứ hai), ngược lại, trả về giá trị của operand thứ hai (không cần biết falsy hay truthy).
    • || trả về giá trị của operand đầu tiên (bên trái) nếu operand đó là truthy value (không quan tâm operand thứ hai), ngược lại, trả về giá trị của operand thứ hai (không cần biết falsy* hay truthy).

Literals

Chả có gì hay ho

Functions

  1. Tên của func có thể có hoặc không. Chỉ đặt tên cho func khi cần gọi lại func đó mà chưa có biến nào trỏ về nó (“chứa” nó).
  2. Có func expression.

Chapter 3: Objects

Object Literals

Retrival

Update

Reference

Prototype

Prototype (???)

Enumeration

Delete

Global Abatement

Chapter 4: Functions

Function Objects

Function Literal

Invocation

Arguments

Return

Exceptions

Augmenting Types

Recursion

Scope

Closure

Callbacks

Module

Cascade

Curry

Memoization

Chapter 5: Inheritance

Pseudo Classical

Object Specifiers

Prototypal

Functional

Parts

Chapter 6: Arrays

Array Literals

Length

Delete

Enumeration

Confusion

Methods

Dimensions

Chapter 7: Regular Expressions

Constructor

Elements

Chapter 9: Style